package ca.etsmtl.log120.tp3.rangs;

import org.omg.CORBA.NO_MEMORY;

import ca.etsmtl.log120.tp3.cartes.Carte;
import ca.etsmtl.log120.tp3.cartes.Denomination;
import ca.etsmtl.log120.tp3.mains.Main;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #3
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : ListeAnalyseurs.java
Date cree : 2011-07-06
Date dern. modif. 2011-07-06
*************************************************** ****
Historique des modifications
*************************************************** ****

***************************************************/

public abstract class AbstractCartesPareilles extends AbstractRangAnalysable{
	
	protected Denomination denom;
	protected Denomination[] resteMain = new Denomination[UtilMain.NOMBRE_CARTES_DANS_MAIN*2]; //Un tableau toujours plus grand qu'il faut (securitaire)
	
	
	//si on prend pas de kickers, on peut mettre cette methode dans rang poker
	//puisque tous les rangs se différencient par la plus haute denomination
	@Override
	protected int comparerRangsIdentiques(AbstractRangAnalysable rang1, AbstractRangAnalysable rang2){
		
		if(rang1.getTopDenomination().compareTo(rang2.getTopDenomination()) > 0)
			return -1;
		else if(rang1.getTopDenomination().compareTo(rang2.getTopDenomination()) < 0)
			return 1;

		return UtilMain.compareKickers(rang1, rang2, UtilMain.NOMBRE_CARTES_DANS_MAIN - getNombreCartesIdentique());
	}
	
	@Override
	public Denomination getTopDenomination(){
		return denom;
	}
	
	@Override
	public boolean reconnaitreMain(Main main) {
		denom = UtilMain.isIdentique(main, getNombreCartesIdentique());

		if(denom != null)
			return true;
		else
			return false;
	}
	
	/**
	 * Methode permettant de determiner le reste de la main pour la comparaison
	 */
	@Override
	public void determineResteMain(Main main) {
		
		Main mainMod = UtilMain.removeDenom(main, denom);
		
		for(int i = 0; i < UtilMain.NOMBRE_CARTES_DANS_MAIN - getNombreCartesIdentique(); i++){
			
			resteMain[i] = UtilMain.getHighestCard(mainMod);
			mainMod = UtilMain.removeDenom(mainMod, resteMain[i]);
		}
	}
	
	/**
	 * Accesseur du tableau representant le reste de la main comparable
	 * @return le tableau de comparaison resteMain
	 */
	public Denomination[] getResteMain(){
		
		return resteMain;
	}
	
	public String toString(){
		
		String string = "Le denominateur principal: " + denom + " Le reste de la main: ";
		
		for(Denomination denom: resteMain){
			
			if(denom != null)
				string = string + " " + denom;
		}
		
		return string;
	}
	
	protected abstract int getNombreCartesIdentique();
}
